<?php
//使用方法：
//		可以取得指定目錄底下的檔案清單(例：public/image/work) - $ary = $this->getDirectoryList('./image/work');
//		取得亂數排序而且指定數量的傳入陣列索引值 - $ary_randIndex = $this->getRandElems($ary, 5);
//		取得csv檔裡面的資料，可以撈指定資料或全撈 - $this->getItem('item.csv', array(3,1,2));

class Application_Model_giagiagiu
{
	/*
	 * 取得指定目錄底下的檔案清單。
	 * @param str $directory 目錄的路徑(預設值從'public/'開始算起)，
	 * 如果要取得'public/image/item/'底下的檔案清單，就傳入參數'./image/item'。
	 * @param ary $results 指定目錄底下的檔案清單(但不包含隱藏檔)。
	 */
	public function getDirectoryList ($directory='./') 
  	{
	    // create an array to hold directory list
	    $results = array();
	
	    // create a handler for the directory
	    $handler = opendir($directory);
	
	    // open directory and walk through the filenames
	    while ($file = readdir($handler)) 
	    {
	      // if file isn't this directory or its parent, add it to the results
	      if ($file != '.' && $file != '..' && 0 != strpos($file, '.')) 
	      {
	        $results[] = $file;
	      }
	
	    }
	
	    // tidy up: close the handler
	    closedir($handler);
	
	    // done!
	    return $results;
  	} 
	
  	/*
  	 * 從傳入的陣列中亂數挑出指定數量的商品資料。
  	 * @param ary $ary 裝有商品資料的陣列
  	 * @param int $amt 指定的數量(預設為全部；如果指定大於商品資料筆數，就回傳洗牌過後的全部商品資料陣列)
  	 * 
  	 * @return ary $ary_randItem 亂數取得的商品資料。
  	 */
  	public function getRandElems($ary, $amt=0)
  	{
  		////如果使用者指定數量小於全部商品資料筆數，採用這個方式：
  		if(0 != $amt && $amt < count($ary))
  		{
	  		srand ((double) microtime() * 10000000);
			$ary_randIndex = array_rand($ary, $amt);
	
	
			//當指定的數量為1時，$ary_randIndex會是個數值，所以一律強制轉換成陣列，以免下面的foreach噴錯。
			$ary_randIndex = (array)$ary_randIndex;
			$ary_randItem = array();
	  		foreach($ary_randIndex as $eachIndex)
			{
				array_push($ary_randItem, $ary[$eachIndex]);
			}
			return $ary_randItem;
  		}
  		////因為回傳全部資料時洗牌洗得不夠亂，所以換這個方式：
		else
		{
			shuffle($ary);
			return $ary_randItem = $ary;
		}
  	}

  	/*
  	 * 從指定的csv檔裡，撈出全部資料或指定ID的資料。
  	 * (有可能是使用者csv檔的內容格式輸入錯誤，造成撈不到任何資料而傳出空陣列。)
  	 * @param str $csvFName CSV檔的檔名。
  	 * @param $itemId NULL:表示撈全部資料；int:表示撈指定ID的資料；ary:表示依照
  	 * 陣列裡紀錄的資料索引值的順序來撈出資料。
  	 * 
  	 * @return ary $ary_items 商品資料
  	 */
	public function getItem($csvFName, $itemId=NULL)
	{
		//為了讓繁體中文能正常顯示。
		setlocale(LC_ALL, 'zh_TW.UTF-8');
		
		$row = 1;
		$ary_items = array();
		if (($handle = fopen($csvFName, "r")) !== FALSE) 
		{
			switch(TRUE)
			{
				//表示撈csv檔裡面全部的商品資料。
				case (is_null($itemId)):
					while (($data = fgetcsv($handle, 0, ",")) !== FALSE) 
				    {
				        array_push($ary_items, $data);
				    }
					break;

				//表示依照傳入的商品ID陣列順序，從csv檔撈出對應的商品資料。
				case (is_array($itemId));
					foreach($itemId as $eachItemId)
					{
						while (($data = fgetcsv($handle, 0, ",")) !== FALSE) 
					    {
					    	if($eachItemId == $data[0])
					        	array_push($ary_items, $data);
					    }
					    rewind($handle);
					}
					break;
				
				//表示只傳入一個商品ID，只要撈一筆符合的商品資料。
				default:
					while (($data = fgetcsv($handle, 0, ",")) !== FALSE) 
				    {
				        if($itemId == $data[0])
				        {
				        	array_push($ary_items, $data);
				        	break;
				        }
				    }
					break;
			}
		    fclose($handle);
		}
		return $ary_items;
	}
}